/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package controladores;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.annotation.PostConstruct;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.inject.Inject;
import modelo.Consumidor;
import modelo.Ingreso;
import modelo.Usuario;
import negocio.ConsumidorBI;
import negocio.IngresoBI;
import negocio.UsuarioBI;

/**
 *
 * @author Francisco
 */
@ManagedBean(name="traspasarIngCtrl")
@ViewScoped
public class TraspasarIngresoCtrl {
    @Inject
    private UsuarioBI usuarioBI;
    @Inject
    private ConsumidorBI consumidorBI;
    @Inject
    private IngresoBI ingresoBI;
    
    private Usuario usuario;
    private LoginCtrl login;
    
    private Integer idConsOrigen;
    private Integer idConsDestino;
    private Integer idIngOrigen;
    private Integer idIngDestino;
    private Double monto;
    private String descripcion;
    private Map<String, Integer> consumidores;
    private Map<String, String> ingresosOrigen = new HashMap<String, String>();
    private Map<String, String> ingresosDestino = new HashMap<String, String>();
    
    @PostConstruct
    public void init(){
        try{
            login = (LoginCtrl)FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("login");
            String nombreUsuario = login.getUsuario();
            usuario = usuarioBI.buscarUsuario(nombreUsuario);
            List<Consumidor> consumidoresUsu = consumidorBI.buscarConsumidoresIngresoPorUsuario(usuario.getIdUsuario());
            consumidores = new HashMap<String, Integer>();
            for (Consumidor consumidor : consumidoresUsu) {
                if(consumidor.getEstatus().equals("A")){
                    consumidores.put(consumidor.getNombre(), consumidor.getIdConsumidor());
                }
            }
        }catch(Exception e){
            FacesContext.getCurrentInstance()
                    .addMessage(null, 
                        new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error", e.getMessage()));
        }
    }
    
    public void seleccionoConsumidor(){
        try{
            if(idConsOrigen!=null){
                Consumidor consumidor = consumidorBI.buscarConsumidor(idConsOrigen);
                ingresosOrigen = new HashMap<String, String>();
                if(consumidor.getIngresoList()!=null && consumidor.getIngresoList().size()>0){
                    for (Ingreso ingreso : consumidor.getIngresoList()) {
                        if(ingreso.getEstatus().equals("A")){
                            ingresosOrigen.put(ingreso.getNombre(), ingreso.getIdIngreso().toString());
                        }
                    }
                }
            }else{
                ingresosOrigen = null;
            }
            if(idConsDestino!=null){
                Consumidor consumidor = consumidorBI.buscarConsumidor(idConsDestino);
                ingresosDestino = new HashMap<String, String>();
                if(consumidor.getIngresoList()!=null && consumidor.getIngresoList().size()>0){
                    for (Ingreso ingreso : consumidor.getIngresoList()) {
                        if(ingreso.getEstatus().equals("A")){
                            ingresosDestino.put(ingreso.getNombre(), ingreso.getIdIngreso().toString());
                        }
                    }
                }
            }else{
                ingresosDestino = null;
            }
        }catch(Exception e){
            FacesContext.getCurrentInstance()
                    .addMessage(null, 
                        new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error", e.getMessage()));
        }
    }
    
    public void transferir(){
        try{
            Consumidor consOrigen = consumidorBI.buscarConsumidor(idConsOrigen);
            if(consOrigen==null){
                throw new Exception("No existe el consumidor origen");
            }
            boolean existeIngreso = false;
            for (Ingreso ingreso : consOrigen.getIngresoList()) {
                if(ingreso.getIdIngreso().equals(Integer.valueOf(idIngOrigen))){
                    existeIngreso = true;
                }
            }
            if(!(existeIngreso)){
                throw new Exception("No existe el ingreso origen");
            }
            
            Consumidor consDestino = consumidorBI.buscarConsumidor(idConsDestino);
            if(consDestino==null){
                throw new Exception("No existe el consumidor origen");
            }
            existeIngreso = false;
            for (Ingreso ingreso : consDestino.getIngresoList()) {
                if(ingreso.getIdIngreso().equals(Integer.valueOf(idIngDestino))){
                    existeIngreso = true;
                }
            }
            if(!(existeIngreso)){
                throw new Exception("No existe el ingreso origen");
            }
            
            Double capital = ingresoBI.transferirMonto(idIngOrigen, idIngDestino, monto, usuario, descripcion);
            
            cancelar();
            FacesContext.getCurrentInstance()
                    .addMessage(null, 
                        new FacesMessage(FacesMessage.SEVERITY_INFO, "Listo", "Guardado con éxito, su saldo es de: "+capital));
            
        }catch(Exception e){
            FacesContext.getCurrentInstance()
                    .addMessage(null, 
                        new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error", e.getMessage()));
        }
    }
    
    public void cancelar(){
        idConsOrigen = null;
        idConsDestino = null;
        idIngDestino = null;
        idIngOrigen = null;
        descripcion = null;
        monto = null;
    }

    public Integer getIdConsOrigen() {
        return idConsOrigen;
    }

    public void setIdConsOrigen(Integer idConsOrigen) {
        this.idConsOrigen = idConsOrigen;
    }

    public Integer getIdConsDestino() {
        return idConsDestino;
    }

    public void setIdConsDestino(Integer idConsDestino) {
        this.idConsDestino = idConsDestino;
    }

    public Integer getIdIngOrigen() {
        return idIngOrigen;
    }

    public void setIdIngOrigen(Integer idIngOrigen) {
        this.idIngOrigen = idIngOrigen;
    }

    public Integer getIdIngDestino() {
        return idIngDestino;
    }

    public void setIdIngDestino(Integer idIngDestino) {
        this.idIngDestino = idIngDestino;
    }

    public Map<String, Integer> getConsumidores() {
        return consumidores;
    }

    public void setConsumidores(Map<String, Integer> consumidores) {
        this.consumidores = consumidores;
    }

    public Map<String, String> getIngresosOrigen() {
        return ingresosOrigen;
    }

    public void setIngresosOrigen(Map<String, String> ingresosOrigen) {
        this.ingresosOrigen = ingresosOrigen;
    }

    public Map<String, String> getIngresosDestino() {
        return ingresosDestino;
    }

    public void setIngresosDestino(Map<String, String> ingresosDestino) {
        this.ingresosDestino = ingresosDestino;
    }

    public Double getMonto() {
        return monto;
    }

    public void setMonto(Double monto) {
        this.monto = monto;
    }

    public String getDescripcion() {
        return descripcion;
    }

    public void setDescripcion(String descripcion) {
        this.descripcion = descripcion;
    }
}
